package com.sgl.retrofitdemo.net;

import com.orhanobut.logger.Logger;
import com.sgl.retrofitdemo.net.exception.ResponseException;

import rx.Observable;
import rx.functions.Func1;

/**
 * Created by sunqiyong on 2016/11/13.
 */

public class RepositoryUtil {
    public static <T> Observable<T> extractData(Observable<ApiResponse<T>> observable) {
        return observable.flatMap((apiResponse) -> {
            if (apiResponse == null) {
                return Observable.error(new ResponseException("network error!"));
            } else if (apiResponse.getCode() != 200) {
                Logger.d("RepositoryUtil:  apiResponse:"+apiResponse.getCode()+"=="+apiResponse.getMessage());
                return Observable.error(new ResponseException(apiResponse.getCode(), apiResponse.getMessage()));
            } else {
                return Observable.just(apiResponse.getData());
            }
        });
    }

    /**
     * 主要处理
     * <p>1、不同 code 值，对应不同 data 值的情况；
     * <p>参考：
     * <p>2、T 中没有 data 值；
     * <p>参考：
     *
     * @param observable
     * @param <T>:       1、 T 中 code 值决定 data 类型，
     *                   并且不同 code 对应的 顶层data 类型不兼容，无法通过增、减数据字段解决；
     *                   如 code=200时，data 是 jsonobject；
     *                   如 code=500时，data 是 jsonarray；
     *                   2、T中没有 data 字段；
     * @return
     */
    public static <T> Observable<T> otherExtractData(Observable<T> observable) {
        return observable.flatMap((apiResponse) -> {
            if (apiResponse == null) {
                return Observable.error(new ResponseException("network error!"));
            }else {
                return Observable.just(apiResponse);
            }
        });
    }
}
